var events = {};

function on(name, self, callback) {
	var tuple = [self, callback];
	var callbacks = events[name];
	if (Array.isArray(callbacks)) {
		callbacks.push(tuple);
	}
	else {
		events[name] = [tuple];
	}
}

function remove(name, self) {
	var callbacks = events[name];
	if (Array.isArray(callbacks)) {
		events[name] = callbacks.filter((tuple) => {
			return tuple[0] != self;
		})
	}
}

function emit(name, data) {
	var callbacks = events[name];
	if (Array.isArray(callbacks)) {
		callbacks.map((tuple) => {
			var self = tuple[0];
			var callback = tuple[1];
			callback.call(self, data);
		})
	}
}

exports.on = on;
exports.remove = remove;
exports.emit = emit;
